這個章節要延續上一篇的郵件服務來繼續介紹下去,上篇使用 原始的郵件服務 去建立寄信,這篇要使用 mailable 來建立寄件服務,這兩個語法其實很類似,在於有沒有匿名函示去做郵件資訊。

近期 Laravel 8 發布了,但因為我目前習慣使用 Laravel 7 的版本,所以還是會以 7 做範例。

建立 Laravel7 專案語法

1
$ composer create-project laravel/laravel=7.25.* 專案名稱

郵件

設定郵件服務,使用SMTP服務,設定Gmail Host等設定。
專案 > .env 設定檔

1
2
3
4
5
6
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=xxxxxx@gmail.com
MAIL_PASSWORD=xxxxxxxxxx
MAIL_ENCRYPTION=tls

建立 Mailables 類別

使用 artisan 指令建立 Mailables 類別

1
$ php artisan make:mail MyTestMail
1
Mail created successfully.

上面指令建立的PHP檔

__construct() 的方法 為建構子,將這個類別建立成物件的時候,會一併執行。大部分裡面的內容都是執行必要動作。

build() 的方法 主要定義要使用哪個 View 的 Blade(模板)、主旨、BCC、CC 等資訊。

專案 > app > Mail > MyTestMail.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class MyTestMail extends Mailable
{
use Queueable, SerializesModels;

/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('view.name');
}
}

自行定義這個類別,是因為有些專案可能會有多個不同的郵件內容信,所以以類別可以去區分我們所要的東西,但也可以寫得更活化,不一定要用固定的資料去定義。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class MyTestMail extends Mailable
{
use Queueable, SerializesModels;

// 自行定義變數
public $BladeContent;

public function __construct($EmailContent)
{
// 在這個class裡的變數 等於 傳值過來的資料
$this->BladeContent = $EmailContent;
}


public function build()
{
// 透過 with 把參數指定給 view
return $this->from(env('MAIL_USERNAME'),'Sian')
->subject('2020/06/30 Laravel 郵件研討會邀請')
->view('emails.EDM')
->with( [
// 另外定義一個陣列名稱
// 這個陣列名稱 等於 這邊定義的public $BladeContent
'BladeContent' => $this->BladeContent
]);
}
}
  • from(env('MAIL_USERNAME'),'Sian') 寄件人
  • subject('2020/06/30 Laravel 郵件研討會邀請') 信件標題
  • view('emails.EDM') 信件內容
  • with('xx'=>xxx) 參數傳入信件內容
  • attach($file,array $option=[]) 夾帶檔案
  • priority($Level = n) 優先等級1到5,1是最高、5是最低

大致上與 原始郵件語法 類似。

建立 信件內容

專案 > resource > views > emails > EDM.blade.php

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="zh-Hant-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
</head>
<body>
<!-- 將 MyTestMail.php 的 build 方法,定義的 BladeContent 陣列資料帶入-->
{{ $BladeContent['name'] }}您好,近期舉辦 Laravel 郵件研討會,歡迎各界好手踴躍參與。
</body>
</html>

建立 Mail Controller

建立 TestMailController 是為了專門處理多筆寄件人的信件。

1
$ php artisan make:controller TestMailController
1
Controller created successfully.

專案 > app > Http > Controllers > TestMailController.php

1
2
3
4
5
6
7
8
9
10
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestMailController extends Controller
{
//
}
  1. 引入 Mail 的類別
  2. 引入 自行定義的 Mail 內容類別。專案 > app > Mail > MyTestMail.php
  3. 建立一個 send() 的方法
  4. 在方法內設定 (1)收件者資訊 (2)Blade 模板所需要的參數 (3)將資料傳入寄件資訊及內容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Mail\MyTestMail;

class TestMailController extends Controller
{
public function send(){
// 收件者資訊以使用 collect 集合,列出二維陣列,陣列key值包含 "name", "email"
// 有可能會有多筆寄件人,會以陣列做為存入
$to = collect([
[
'name' => 'Black',
'email' => 'ya005845@hotmail.com'
]
]);

// 提供 Blade 模板的參數
$EmailContent = [
'name' => 'Small Black'
];

// 使用引入的類別,進行郵件寄送
Mail::to($to)
->send(new MyTestMail($EmailContent));

// 執行完成做一個回饋,這樣得知程式執行完成。
return '發送成功';
}
}

傳送 Mailable 的方法

1、寄件人、傳送內容

1
2
Mail::to($to)
->send(new MyTestMail($EmailContent));

2、連同 CC/BCC

1
2
3
4
Mail::to($to)
->cc($cc)
->bcc($bcc)
->send(new MyTestMail($EmailContent));

設定路由

專案 > routes > web.php

1
2
3
4
5
<?php

use Illuminate\Support\Facades\Route;

Route::get('/send', 'TestMailController@send');

執行專案

1
$ php artisan serve

連結
http://127.0.0.1:8000/send

成功寄發

※ 觀看我文章的看官們,如果你專案是 Laravel 是 8版的,可能會遇到 controller 找不到的問題,解決辦法可以參考下方連結試試看。
Target class controller does not exist - Laravel 8

結論

其實兩種 Mail 語法用法類似,但取決於開發者要用哪一種,但本人會比較習慣用後者,畢竟結構性比較好。下一章節還是會介紹郵件的部分,會以比較深入去做實作。

標籤: w3HexSchool PHP Laravel